home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / DEMO / EXCTEST.M < prev    next >
Encoding:
Text File  |  1990-02-23  |  2.9 KB  |  102 lines

  1. MODULE ExcTest;
  2.  
  3. (* Demo-Programm für Modul 'EasyExceptions' *)
  4.  
  5. IMPORT InOut, EasyExceptions;
  6.  
  7. MODULE localMod;
  8.  
  9. (*
  10.  * Dies lokale Modul exportiert eine Funktion 'DoIt', die zwei Zahlen
  11.  * multiplizieren kann.
  12.  * Zwei Fehler können auftreten:
  13.  *  - Das Ergebnis wird größer als 65335 - ein Überlauf tritt auf,
  14.  *    der durch 'EasyExceptions.Overflow()' signalisiert wird.
  15.  *  - Der Anwender gibt ungültige Werte ein - Die Funktion 'DoIt'
  16.  *    löst diesen Fehler selbst aus (mittels 'Raise') - der Aufrufer
  17.  *    kann dies mit 'InputFault()' ermitteln (s.u.).
  18.  * Die Kennung für den Laufzeitfehler sollte nach außen nur über eine
  19.  * Funktion zugänglich gemacht werden, um zu verhindern, daß sie von
  20.  * außen verändert werden könnte.
  21.  *)
  22.  
  23.   IMPORT InOut, EasyExceptions;
  24.   
  25.   EXPORT DoIt,          (* Die Funktion *)
  26.          InputFault;    (* Die Kennung für Eingabefehler *)
  27.  
  28.   VAR myError: EasyExceptions.Exception;
  29.   
  30.   PROCEDURE InputFault (): EasyExceptions.Exception;
  31.     BEGIN
  32.       RETURN myError
  33.     END InputFault;
  34.  
  35.   PROCEDURE DoIt;
  36.     VAR c1, c2: CARDINAL;
  37.     BEGIN
  38.       InOut.WriteLn;
  39.       InOut.WriteString ('Multiplikation zweier CARDINAL-Zahlen');
  40.       InOut.WriteLn;
  41.       InOut.WriteString (' Erste Zahl? ');
  42.       InOut.ReadCard (c1);
  43.       IF NOT InOut.Done THEN
  44.         (* Fehler signalisieren und zum Aufrufer von 'Call' zurückkehren *)
  45.         EasyExceptions.Raise (InputFault ())
  46.       END;
  47.       InOut.WriteString (' Zweite Zahl? ');
  48.       InOut.ReadCard (c2);
  49.       IF NOT InOut.Done THEN
  50.         EasyExceptions.Raise (InputFault ())
  51.       END;
  52.       InOut.WriteLn;
  53.       InOut.WriteString ('Ergebnis: ');
  54.       InOut.WriteCard (c1 * c2, 0); (* Hier kann ein Überlauf auftreten *)
  55.       InOut.WriteLn
  56.     END DoIt;
  57.  
  58.   BEGIN
  59.     (* Die Kennung muß zuerst einmal erzeugt werden *)
  60.     EasyExceptions.New (myError)
  61.   END localMod;
  62.  
  63. VAR result: EasyExceptions.Exception;
  64.  
  65. PROCEDURE Report (text: ARRAY OF CHAR);
  66.   VAR ch: CHAR;
  67.   BEGIN
  68.     InOut.WriteLn;
  69.     InOut.WriteString (text);
  70.     InOut.WriteString ('   Taste...');
  71.     InOut.Read (ch);
  72.     InOut.WriteLn;
  73.   END Report;
  74.  
  75. PROCEDURE Abort (): BOOLEAN;
  76.   VAR ch: CHAR;
  77.   BEGIN
  78.     InOut.WriteLn;
  79.     InOut.WriteString ('Nochmal (J/N)? ');
  80.     InOut.Read (ch);
  81.     InOut.WriteLn;
  82.     RETURN CAP (ch) = 'N'
  83.   END Abort;
  84.  
  85. BEGIN
  86.   REPEAT
  87.     EasyExceptions.Call (DoIt, result);
  88.     IF result = EasyExceptions.NormalReturn () THEN
  89.       Report ('Kein Fehler.')
  90.     ELSIF result = EasyExceptions.Overflow () THEN
  91.       Report ('Überlauf!')
  92.     ELSIF result = InputFault () THEN
  93.       Report ('Eingabefehler!')
  94.     ELSE
  95.       (* Unerkannte / unerwartetet Fehler weiterreichen *)
  96.       (* -- Kann ausprobiert werden, indem einer *)
  97.       (*    der oberen Fälle eingeklammert wird. *)
  98.       EasyExceptions.Raise (result)
  99.     END;
  100.   UNTIL Abort ()
  101. END ExcTest.
  102.